  import java.awt.FlowLayout; 
  import java.awt.GridLayout; 
  import java.awt.event.ActionEvent; 
  import java.awt.event.ActionListener; 
  import javax.swing.JButton; 
  import javax.swing.JFrame; 
  import javax.swing.JPanel; 
  import javax.swing.JTextArea; 
   
 /** 
    A frame displaying the components of an ATM. 
 */ 
 public class ATMFrame extends JFrame 
 { 
    /** 
       Constructs the user interface of the ATM frame. 
   */ 
    public ATMFrame(ATM anATM) 
    { 
       theATM = anATM; 
  
       // Construct components 
       pad = new KeyPad(); 
  
       display = new JTextArea(4, 20); 
 
       aButton = new JButton(  A  ); 
       aButton.addActionListener(new AButtonListener()); 
  
       bButton = new JButton(  B  ); 
       bButton.addActionListener(new BButtonListener()); 
 
       cButton = new JButton(  C  ); 
       cButton.addActionListener(new CButtonListener()); 
 
       // Add components 
  
       JPanel buttonPanel = new JPanel(); 
       buttonPanel.setLayout(new GridLayout(3, 1)); 
       buttonPanel.add(aButton); 
       buttonPanel.add(bButton); 
       buttonPanel.add(cButton); 
  
      setLayout(new FlowLayout()); 
       add(pad); 
       add(display); 
       add(buttonPanel); 
       showState(); 
 
       setSize(FRAME_WIDTH, FRAME_HEIGHT); 
   } 
  
    /** 
       Updates display message. 
    */ 
    public void showState() 
    { 
       int state = theATM.getState(); 
       pad.clear(); 
       if (state == ATM.START) 
          display.setText(Enter customer number\nA = OK); 
       else if (state == ATM.PIN) 
          display.setText(Enter PIN\nA = OK); 
       else if (state == ATM.ACCOUNT) 
          display.setText(Select Account\n 
                + A = Checking\nB = Savings\nC = Exit); 
       else if (state == ATM.TRANSACT) 
          display.setText(Balance =  
                + theATM.getBalance() 70                + \nEnter amount and select transaction\n 
                + A = Withdraw\nB = Deposit\nC = Cancel); 
    } 
  
    private class AButtonListener implements ActionListener 
    { 
       public void actionPerformed(ActionEvent event) 
      { 
          int state = theATM.getState(); 
         if (state == ATM.START) 
             theATM.setCustomerNumber((int) pad.getValue()); 
          else if (state == ATM.PIN) 
             theATM.selectCustomer((int) pad.getValue()); 
          else if (state == ATM.ACCOUNT) 
            theATM.selectAccount(ATM.CHECKING); 
          else if (state == ATM.TRANSACT) 
          { 
             theATM.withdraw(pad.getValue()); 
             theATM.back(); 
          } 
         showState(); 
       } 
    } 
  
    private class BButtonListener implements ActionListener 
    { 
      public void actionPerformed(ActionEvent event) 
       { 
          int state = theATM.getState(); 
          if (state == ATM.ACCOUNT) 
            theATM.selectAccount(ATM.SAVINGS); 
         else if (state == ATM.TRANSACT) 
        { 
            theATM.deposit(pad.getValue()); 
           theATM.back(); 
         } 
         showState(); 
      } 
   } 
  
   private class CButtonListener implements ActionListener 
   { 
     public void actionPerformed(ActionEvent event) 
      { 
         int state = theATM.getState(); 
         if (state == ATM.ACCOUNT) 
            theATM.reset(); 
         else if (state == ATM.TRANSACT) 
            theATM.back(); 
         showState(); 
      } 
   } 
 
   private JButton aButton; 
   private JButton bButton; 
   private JButton cButton; 
  
   private KeyPad pad; 
   private JTextArea display; 
 
   private ATM theATM; 
  
   private static final int FRAME_WIDTH = 300; 
   private static final int FRAME_HEIGHT = 400; 
} 
